package com.echo.im.infrastructure.mq.event;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * 基础事件类，为所有事件提供公共结构和操作
 * 该类是抽象的，要求子类实现其具体功能
 *
 * @author echo
 * @param <T> 事件数据的类型，泛型提供灵活性
 */
@Data
public abstract class BaseEvent<T> {

    /**
     * 构建一个EventMessage对象，将给定的数据包装在事件消息中
     * 必须由子类实现，以支持不同类型的数据
     *
     * @param data 要包装在事件消息中的数据
     * @return 包含给定数据的EventMessage对象
     */
    public abstract EventMessage<T> buildEventMessage(T data);


    /**
     * 获取事件的主题字符串
     *
     * @return 事件的主题字符串
     */
    public abstract String topic();

    /**
     * 获取事件的交换机名称
     * @return
     */
    public abstract String exchange();

    /**
     * EventMessage类，用于封装事件相关的数据和信息
     *
     */
    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class EventMessage<T> {
        private String id;
        private Date timestamp;
        private T data;

    }

}
